package org.wyw.utils;

import java.time.LocalDate;
import java.time.Period;

/**
 * 在Java中，使用LocalDate类的plusYears方法时，如果开始日期是2月29日，而20年后不是闰年，没有2月29日，那么plusYears方法会将日期调整到最接近的合法日期。具体来说，它会将日期调整到2月28日。
 */
public class IDCardValidator {
    // 校验身份证有效期
    public static boolean validateIDCardValidity(String idCard, LocalDate issueDate, LocalDate startDate, LocalDate endDate) {
        if (idCard == null || idCard.length() != 18) {
            throw new IllegalArgumentException("Invalid ID card number");
        }

        // 提取出生日期
        String birthDateStr = idCard.substring(6, 14);
        int year = Integer.parseInt(birthDateStr.substring(0, 4));
        int month = Integer.parseInt(birthDateStr.substring(4, 6));
        int day = Integer.parseInt(birthDateStr.substring(6, 8));
        LocalDate birthDate = LocalDate.of(year, month, day);

        // 计算年龄
        int age = Period.between(birthDate, issueDate).getYears();

        // 根据年龄确定有效期
        int validityYears;
        if (age < 16) {
            validityYears = 5;
        } else if (age < 26) {
            validityYears = 10;
        } else if (age < 46) {
            validityYears = 20;
        } else {
            validityYears = Integer.MAX_VALUE; // 长期有效
        }

        // 计算有效期结束日期
        LocalDate expectedEndDate = validityYears == Integer.MAX_VALUE ? LocalDate.of(9999, 12, 31) : issueDate.plusYears(validityYears);

        // 校验有效期
        return startDate.isEqual(issueDate) && endDate.isEqual(expectedEndDate);
    }

    public static void main(String[] args) {
        // 示例身份证号码
        String idCard = "123456200902101234";
        // 发证日期
        LocalDate issueDate = LocalDate.of(2024, 2, 29);
        // 有效期开始日期
        LocalDate startDate = LocalDate.of(2024, 2, 29);
        // 有效期结束日期
        LocalDate endDate = LocalDate.of(2029, 2, 28);

        boolean isValid = validateIDCardValidity(idCard, issueDate, startDate, endDate);
        System.out.println("Is ID card validity correct? " + isValid);
    }

}
